#include "nec.hpp"

token::token(string n,string f,int l,int c) :
	str(n),file(f),line(l),col(c) {
	if (isdigit(n[0])) {
		type=2;
		i=0;
		for (int j=0;j<n.length();j++)
			i=i*10+n[j]-'0';
	} else if (is_letter(n[0])) {
		type=1;
	} else if (n[0]=='\'') {
		type=3;
		if ((c=n[1])=='\\') {
			switch (n[2]) {
			case 'n':
				c='\n';
				break;
			case '0':
				c='\0';
				break;
			case 't':
				c='\t';
				break;
			case '\\':
				c='\\';
				break;
			case '\'':
				c='\'';
				break;
			case '\"':
				c='\"';
				break;
			default:
				error(file,line,col,"Invalid char literal");
			}
		}
	} else if (n[0]=='\"') {
		type=4;
		i=0;
		for (int j=1;n[j]!='"';j++) {
			i++;
			if (n[j]=='\\') j++;
		}
		s=vector<char>(i);
		i=0;
		for (int j=1;n[j]!='"';j++) {
			if (n[j]!='\\') s[i++]=n[j];
			else switch(n[++j]) {
			case 'n':
				s[i++]='\n';
				break;
			case '0':
				s[i++]='\0';
				break;
			case 't':
				s[i++]='\t';
				break;
			case '\\':
				s[i++]='\\';
				break;
			case '\'':
				s[i++]='\'';
				break;
			case '\"':
				s[i++]='\"';
				break;
			default:
				error(file,line,col,"Invalid char in string literal");
			}
		}
	} else type=0;
}

string token::stype() {
	switch(type) {
	case 0:
		return "operator";
	case 1:
		return "identifier";
	case 2:
		return "int";
	case 3:
		return "char";
	case 4:
		return "string";
	}
}

